/**
 * Linux下的守护进程（服务）的编写样例
 * @author 张伟
 * @date 2017/1/7
 */
#include <unistd.h>
#include <stdio.h>
#include <sys/stat.h>
#include <signal.h>

#define MAXFILE 65535

volatile sig_atomic_t _running = 1;

void signal_sigkill(int num)
{
	_running = 0;
}

int main()
{
	int pid = fork();	/// 1. 第一次fork，产生一个子进程，父进程退出
	if (pid < 0)
	{
		printf("error\n");
		return -1;
	}
	else if (pid > 0)
	{
		printf("This is the parent process\n");
		return 0;
	}

	setsid();		/// 2. 为子进程创建session和进程组；然后第二次fork，产生一个子进程，父进程退出
	if ((pid = fork()) <0)
		return -1;
	else if (pid > 0)
		return 0;

	chdir("/");		/// 3. 将工作目录设置为根目录，防止对其他目录的占用

	umask(0);		/// 4. 设置创建文件的权限掩码

	for (int i = 0; i < MAXFILE; i++)	/// 5. 关闭所有已经打开的句柄，包括标准输入、标准输出、标准错误
	{
		close(i);
	}

	printf("This is the child process\n");

	/// 6. 为kill信号设置处理函数
	signal(SIGKILL, signal_sigkill);

	while (_running)
	{
		printf("alive!\n");
		sleep(1);
	}

	return 0;
}
